#ifndef GSYNCER_H_
#define GSYNCER_H_
#include <stdint.h>
#include <sys/types.h>
#include <string>
#include <vector>
using std::string;
using std::vector;

//全局宏
#define SRV_IP "192.168.0.106"  //服务器IP
#define SRV_CTL_PT 1234         //服务器控制端口
#define SRV_TSF_PT 1235			//服务器端口

#define USR_LEN 20    //最大用户名长度
#define PWD_LEN 11     //最大密码长度
#define PATH_LEN 1000    //最大路径长度
#define FILE_LEN 100    //最长路径名
#define BUF_SIZ 1024

#define CTL 1
#define TSF 2

#define REG 1     //注册
#define LOGIN 2   //登录

#define CREATE 1    //新建目录
#define CREATE_F 7  //创建文件
#define DEL_F  2    //删除文件
#define DEL_D  3    //删除目录
#define UP_F   4    //更新文件
#define UP_D   5    //更新目录
#define EXIT   6

//信号量
#define QUEUE_N 0
#define MUTEX 1

//信号量的KEY
#define SEM_KEY 1026

#define SA struct sockaddr
#define SRV_ROOT "/gsync"

//函数声明
int init_semvalue(int sem_id, int sem_num);
int sem_wait(int sem_id, int sem_num);
int sem_signal(int sem_id, int sem_num);
ssize_t writen(int fd, const void *vptr, size_t n);
void Writen(int fd, void *ptr, size_t nbytes);
ssize_t readn(int fd, void *vptr, size_t n);
void file_rcv(int det, int src);
void file_copy(int det, int src);
void get_home(string& dir);
void* process_thread(void* gsyncer);
void dir_search(vector<string>& watch_list, string& pre_path);

//结构声明
struct usr_info 
{
	uint8_t type;   //1表示注册  2表示登录
	char usr[USR_LEN]; //用户名
	char pwd[PWD_LEN]; //密码
};

struct event_info
{
	uint8_t type;   
	char path[PATH_LEN]; //文件所在目录
    //	char file[FILE_LEN]; //文件名
};

struct update_head
{
	uint8_t type;
	char usr[USR_LEN];
	char pwd[PWD_LEN];
	char path[PATH_LEN];
};

#endif
